{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Count 1s in a sequence using simple RNN\n",
    "\n",
    "In this example, we'll implement a basic RNN from scratch (without using any NN libraries). We'll train the network to count the number of 1s in a sequence of 0s and 1s. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's start with the imports:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We'll continue by defining a single forward step of the RNN:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def step(s, x, U, W):\n",
    "    return x * U + s * W"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we'll define the full sequence processing routine:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def forward(x, U, W):\n",
    "    # Number of samples in the mini-batch\n",
    "    number_of_samples = len(x)\n",
    "\n",
    "    # Length of each sample\n",
    "    sequence_length = len(x[0])\n",
    "\n",
    "    # Initialize the state activation for each sample along the sequence\n",
    "    s = np.zeros((number_of_samples, sequence_length + 1))\n",
    "\n",
    "    # Update the states over the sequence\n",
    "    for t in range(0, sequence_length):\n",
    "        s[:, t + 1] = step(s[:, t], x[:, t], U, W)  # step function\n",
    "\n",
    "    return s"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's continue by defining the backpropagation through time routine for a sequence:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def backward(x, s, y, W):\n",
    "    sequence_length = len(x[0])\n",
    "\n",
    "    # The network output is just the last activation of sequence\n",
    "    s_t = s[:, -1]\n",
    "\n",
    "    # Compute the gradient of the output w.r.t. MSE cost function at final state\n",
    "    gS = 2 * (s_t - y)\n",
    "\n",
    "    # Set the gradient accumulations to 0\n",
    "    gU, gW = 0, 0\n",
    "\n",
    "    # Accumulate gradients backwards\n",
    "    for k in range(sequence_length, 0, -1):\n",
    "        # Compute the parameter gradients and accumulate the results.\n",
    "        gU += np.sum(gS * x[:, k - 1])\n",
    "        gW += np.sum(gS * s[:, k - 1])\n",
    "\n",
    "        # Compute the gradient at the output of the previous layer\n",
    "        gS = gS * W\n",
    "\n",
    "    return gU, gW"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then, let's implement the `train` procedure:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train(x, y, epochs, learning_rate=0.0005):\n",
    "    # Set initial parameters\n",
    "    weights = (-2, 0)  # (U, W)\n",
    "\n",
    "    # Accumulate the losses and their respective weights\n",
    "    losses = list()\n",
    "    gradients_u = list()\n",
    "    gradients_w = list()\n",
    "\n",
    "    # Perform iterative gradient descent\n",
    "    for i in range(epochs):\n",
    "        # Perform forward and backward pass to get the gradients\n",
    "        s = forward(x, weights[0], weights[1])\n",
    "\n",
    "        # Compute the loss\n",
    "        loss = (y[0] - s[-1, -1]) ** 2\n",
    "\n",
    "        # Store the loss and weights values for later display\n",
    "        losses.append(loss)\n",
    "\n",
    "        gradients = backward(x, s, y, weights[1])\n",
    "        gradients_u.append(gradients[0])\n",
    "        gradients_w.append(gradients[1])\n",
    "\n",
    "        # Update each parameter `p` by p = p - (gradient * learning_rate).\n",
    "        # `gp` is the gradient of parameter `p`\n",
    "        weights = tuple((p - gp * learning_rate) for p, gp in zip(weights, gradients))\n",
    "\n",
    "    print(weights)\n",
    "\n",
    "    return np.array(losses), np.array(gradients_u), np.array(gradients_w)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We'll continue with the `plot_training` function that plots the results, returned from the `train` functions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_training(losses, gradients_u, gradients_w):\n",
    "    import matplotlib.pyplot as plt\n",
    "\n",
    "    # remove nan and inf values\n",
    "    losses = losses[~np.isnan(losses)][:-1]\n",
    "    gradients_u = gradients_u[~np.isnan(gradients_u)][:-1]\n",
    "    gradients_w = gradients_w[~np.isnan(gradients_w)][:-1]\n",
    "\n",
    "    # plot the weights U and W\n",
    "    fig, ax1 = plt.subplots(figsize=(10, 6.8))\n",
    "\n",
    "    ax1.set_ylim(-3, 600)\n",
    "    ax1.set_xlabel('epochs')\n",
    "    ax1.plot(gradients_u, label='grad U', color='blue', linestyle=':')\n",
    "    ax1.plot(gradients_w, label='grad W', color='red', linestyle='--')\n",
    "    ax1.legend(loc='upper left')\n",
    "\n",
    "    # instantiate a second axis that shares the same x-axis\n",
    "    # plot the loss on the second axis\n",
    "    ax2 = ax1.twinx()\n",
    "\n",
    "    # uncomment to plot exploding gradients\n",
    "    ax2.set_ylim(-3, 200)\n",
    "    ax2.plot(losses, label='Loss', color='green')\n",
    "    ax2.tick_params(axis='y', labelcolor='green')\n",
    "    ax2.legend(loc='upper right')\n",
    "\n",
    "    fig.tight_layout()\n",
    "\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, let's train the network to learn a single short binary sequence, where `x` is the sequence and `y` is the label:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(-2.088692479228279, -0.7529413189879612)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsgAAAHiCAYAAAD1dDq7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeXxU1f3/8ffJDpOAqIgKWLRSW1FBQBFBtLjUnZa2Ir+qaLXY1qVWv1qX1mG616Ut1gWpqFj3qlUE0arV0kqxohW1osW1xLLJGhJCts/vj3Mv9wwkIQkJCfB6Ph73Mfecc5czM3fmvufkZsaZmQAAAAB4Oe3dAQAAAKAjISADAAAAAQIyAAAAECAgAwAAAAECMgAAABAgIAMAAACBvKYs5JzbSdIdkg6QZJK+KeldSQ9J6iPpI0mnmdlK55yTNFHSiZIqJJ1tZq+1es8BAACww3EZ11vSPZJ6yOfSyZa2iS7jdtbG2TRtK12mnmyabjybNnUEeaKkp83s85L6S5ov6UpJz5tZX0nPR2VJOkFS32gaL+m2Ju4DAAAA2JwaSZdZ2vaXdJikC1zG7a84m6a3PJtuNiA757pKGiFpiiSZWZWZrZI0StLUaLGpkr4czY+SdI95cyTt5Jzbowl3FgAAAGiUpW1RPAJsaSuTH7jtqc1l07SZpaNsmmk8mzZlBHlvScsk3eWc+5dz7g7nXEpSDzNbFC2zWH6YW1EHFwbrl0Z1AAAAQKtxGddH0sGSXpbUw9Ktk02bcg1ynqSBki4ys5edcxOVDFlLkszMnHPN+s1q59x4+WFuSRrUuXPn5qwOAACA7VBFRYVJCq8RnmxmkzdezmVcsaRHJV1iaVvjMm5Dm6XNXKZ52TTUlIBcKqnUzF6Oyo/IB+Qlzrk9zGxRdAnF0qj9E0m9g/V7RXVZojs6WZJSqZSVl5e38C4AAABge+GcW2dmgxtdJuPy5cPxfZa2x6LqJS7j9rC0LYouoWhWNg1t9hILM1ssaaFzbr+o6mhJb0uaJmlcVDdO0hPR/DRJZznvMEmrg0sxAAAAgBaLvpViiqT5lrZfB02NZ9OMcy4TZdN049m0SV/zJukiSfc55wokfSDpHPlw/bBz7lxJH0s6LVr2Kfmv0XhP/qs0zmniPgAAAIDNGSbpTElvuox7Paq7WtIvJT3sMlueTZ1Ziy/PaDVcYgEAAABJcs5VmFmqPfvQ1BHkra66ulqlpaWqrKxs7650OEVFRerVq5fy8/PbuysAAKAN7Ag5qCPnmQ47gvzhhx+qpKREu+yyi/yP80GSzEzLly9XWVmZ9t577/buDgAAaAPbew5qLM90hBHkpv6S3lZXWVm53R4UW8I5p1122WW7/kQJAMCObnvPQR09z3TYgCxpuz0othSPCwAA27/t/Xzfke9fhw7I25s+ffro008/3aS+uLg4q3z33Xfrwgsv3FrdAgAA2MTG+WRHQkDeQjU1Ne3dBQAAALQiAnIjfvKTn2i//fbT8OHDNXbsWN1www2SpKOOOkqXXHKJBg8erIkTJ+rJJ5/UkCFDdPDBB+uYY47RkiVLJEnLly/Xcccdp379+um8885TR/iHSAAAgJb66KOPNHLkSB100EE6+uij9d///leS9Mc//lEHHHCA+vfvrxEjRkiS/v3vf+vQQw/VgAEDdNBBB2nBggXt2fVm6bBf87axo46Szj7bT9XV0rHHSuedJ51xhlRRIZ14ovSd70hjxkirV0ujRkkXXyyNHi19+qn0ta9Jl10mnXKKtHixtPvuje/vlVde0aOPPqp58+apurpaAwcO1KBBgza0V1VVae7cuZKklStXas6cOXLO6Y477tB1112nG2+8UZlMRsOHD9e1116rGTNmaMqUKW32+AAAgO3TJU9fotcXv775BZthwO4D9Nvjf9vs9S666CKNGzdO48aN05133qmLL75Yjz/+uH784x/rmWeeUc+ePbVq1SpJ0qRJk/S9731P3/jGN1RVVaXa2tpWvQ9taZsJyFvbSy+9pFGjRqmoqEhFRUU65ZRTstrHjBmzYb60tFRjxozRokWLVFVVteHrSmbNmqXHHvM/D37SSSepW7duTd5/R75wHQAA7Jj+8Y9/bMg2Z555pq644gpJ0rBhw3T22WfrtNNO0+jRoyVJQ4cO1c9+9jOVlpZq9OjR6tu3b7v1u7m2mYD84ovJfH5+drlz5+xy167Z5V13zS5vbvS4KVKp5Ov5LrroIl166aU69dRT9eKLL2rChAnN2lanTp1UVVWlgoICSdKKFSu06667bnknAQDANq8lI71b26RJk/Tyyy9rxowZGjRokF599VX9v//3/zRkyBDNmDFDJ554om6//XaNHDmyvbvaJFyD3IBhw4bpySefVGVlpdauXavp06c3uOzq1avVs2dPSdLUqVM31I8YMUL333+/JGnmzJlauXJlvesfeeSRuvfeeyVJ69at08MPP6wvfvGLrXVXAAAAWsXhhx+uBx98UJJ033336YgjjpAkvf/++xoyZIh+/OMfq3v37lq4cKE++OAD7bPPPrr44os1atQovfHGG+3Z9WbZZkaQt7ZDDjlEp556qg466CD16NFDBx54oLp27VrvshMmTNDXv/51devWTSNHjtSHH34oSUqn0xo7dqz69eunww8/XHvttVe960+cOFHnn3++brrpJpmZzjrrrA0XuAMAALSHiooK9erVa0P50ksv1e9+9zudc845uv7669W9e3fdddddkqTLL79cCxYskJnp6KOPVv/+/fWrX/1Kf/jDH5Sfn6/dd99dV199dXvdlWbrsD81PX/+fH3hC19opx55a9euVXFxsSoqKjRixAhNnjxZAwcObNc+xTrC4wMAANrGjnKer+9+doSfmmYEuRHjx4/X22+/rcrKSo0bN67DhGMAAAC0HQJyI+LrhwEAALDj4J/0AAAAgAABGQAAoAPqCP8n1pY68v0jIAMAAHQwRUVFWr58eYcOkVvCzLR8+XIVFRW1d1fqxTXIAAAAHUyvXr1UWlqqZcuWtXdX2kxRUVHW18h1JATkrahPnz6aO3du1q/kTZw4UR9++KF++1v/Kznnn3++3n//fT333HOSpN/97ndasGCBbrrppnbpMwAA2Pry8/O19957t3c3dlhcYrGFampqtmj9YcOGafbs2RvK8+bN0+rVq1VbWytJmj17tg4//PAt2gcAAACajoDciJ/85Cfab7/9NHz4cI0dO1Y33HCDJOmoo47SJZdcosGDB2vixIl68sknNWTIEB188ME65phjtGTJEknS8uXLddxxx6lfv34677zz6r2OaMCAAfrPf/6jdevWafXq1erUqZMGDBigN998U5IPyMOGDdt6dxoAAGAHt+1cYnHUUZvWnXaa9N3vShUV0oknbtp+9tl++vRT6Wtfy2578cVGd/fKK6/o0Ucf1bx581RdXa2BAwdq0KBBG9qrqqo0d+5cSdLKlSs1Z84cOed0xx136LrrrtONN96oTCaj4cOH69prr9WMGTM0ZcqUTfaTl5engw8+WK+88orWrVunIUOGqG/fvpo9e7a6d+8uM1Pv3r0bf2wAAADQ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\n",
      "text/plain": [
       "<Figure size 720x489.6 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.array([[0, 0, 0, 0, 1, 0, 1, 0, 1, 0]])\n",
    "y = np.array([3])\n",
    "\n",
    "losses, gradients_u, gradients_w = train(x, y, epochs=150)\n",
    "plot_training(losses, gradients_u, gradients_w)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To demonstrate the vanishing gradients problem, we'll train the network using longer sequence:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/lib/python3/dist-packages/ipykernel_launcher.py:2: RuntimeWarning: overflow encountered in multiply\n",
      "  \n",
      "/usr/lib/python3/dist-packages/ipykernel_launcher.py:16: RuntimeWarning: invalid value encountered in multiply\n",
      "  app.launch_new_instance()\n",
      "/usr/lib/python3/dist-packages/ipykernel_launcher.py:17: RuntimeWarning: invalid value encountered in multiply\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(nan, nan)\n"
     ]
    },
    {
     "data": {
      "image/png": "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xImsWrWK0tJSioqKWL169Wn7FhQUEBcXB8CyZcvc7ZMnT+bFF18E4K233iIvL6/W68877zyWL18OwPHjx3nllVc4//zzvfVTRERERLzi3HPP5aWXXgLghRde4Ec/+hEAe/bsYdy4cdx///3ExsZy8OBB9u7dS58+fVi4cCGzZs1iy5Ytviy9UfxmBrmlnX322cycOZPhw4fTvXt3hg0bRnR0dK1977vvPq688ko6derEBRdcwL59+wBISUlh7ty5DBkyhHPPPZfExMRar1+8eDG33HILjz76KNZarrvuOvcCdxERERFfKCkpIT4+3v150aJFPPbYY9x44438+c9/JjY2lmeffRaA//3f/yU1NRVrLVOnTmXEiBE8+OCDPP/88wQHB9OjRw/uvvtuX/2URjOtYWeF8PBwW1xcXKNtx44dDBo0yEcVORUVFREREUFJSQmTJ09myZIljB492qc1VWsNfz4iIiJSt2tWXMOmQ5vYtWBXo65rL/+er+13GmNKrLXhp7mkRWgGuQ7z589n+/btlJaWcv3117eacCwiIiIizUcBuQ7V64dFREREpP3QTXoiIiIiIh4UkEVERERaodZwn1hzas2/TwFZREREpJUJDQ0lNze3VYfIprDWkpubS2hoqK9LqZXWIIuIiIi0MvHx8aSnp3P48GFfl9JsQkNDa2wj15ooILegpKQkNm3aVOMpeYsXL2bfvn387W/Op+Tccsst7Nmzh/fffx+Axx57jNTUVB599FGf1CwiIiItLzg4mN69e/u6jHZLSyyaqKKioknXT5w4kc8++8z9efPmzRQUFFBZWQnAZ599xrnnntuk7xARERGRhlNArsPvf/97BgwYwKRJk5g7dy5/+ctfAJgyZQp33HEHY8eOZfHixaxatYpx48YxatQoLrzwQrKzswHIzc3l4osvZsiQIdx88821riMaOXIku3bt4vjx4xQUFBAWFsbIkSPZunUr4AzIEydObLkfLSIiItLO+c8SiylTTm276iq47TYoKYHp0089f8MNzteRIzB7ds1z69fX+XVffvklK1asYPPmzZSXlzN69GjGjBnjPl9WVsamTZsAyMvLY8OGDRhjePrpp3nooYd4+OGHcTgcTJo0iXvvvZc1a9awdOnSU74nKCiIUaNG8eWXX3L8+HHGjRtHcnIyn332GbGxsVhrSUhIqPvPRkRE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\n",
      "text/plain": [
       "<Figure size 720x489.6 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.array([[0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0]])\n",
    "y = np.array([12])\n",
    "\n",
    "losses, gradients_u, gradients_w = train(x, y, epochs=150)\n",
    "plot_training(losses, gradients_u, gradients_w)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
